package short_semester.questionnaire_planet.service.editService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import short_semester.questionnaire_planet.dao.*;
import short_semester.questionnaire_planet.entity.User;
import short_semester.questionnaire_planet.pojo.*;
import short_semester.questionnaire_planet.response.CommonResponse;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

@Service
public class QuestionnaireService {
    @Autowired
    QuestionnaireDao questionnaireDao;
    
    @Autowired
    QuestionService questionService;
    
    @Autowired
    UserDao userDao;
    
    @Autowired
    SingleChoiceQuestionDao singleChoiceQuestionDao;
    
    @Autowired
    MultiChoiceQuestionDao multiChoiceQuestionDao;
    
    @Autowired
    ScoreQuestionDao scoreQuestionDao;
    
    @Autowired
    FillBlankQuestionDao fillBlankQuestionDao;
    
    @Autowired
    RelationService relationService;

    @Autowired
    SingleChoiceQuestionService singleChoiceQuestionService;
    @Autowired
    MultiChoiceQuestionService multiChoiceQuestionService;
    @Autowired
    FillBlankQuestionService fillBlankQuestionService;
    @Autowired
    ScoreQuestionService scoreQuestionService;
    @Autowired
    QuestionSequenceRecordDao questionSequenceRecordDao;
    @Autowired
    QuestionnaireRecordDao questionnaireRecordDao;

    @Autowired
    RelationDao relationDao;
    
    
    //获取问卷信息
    public CommonResponse getQuestionnaire(Integer questionnaireId){
        CommonResponse response = new CommonResponse();
        try{
            Optional<Questionnaire> optional = questionnaireDao.findById(questionnaireId);
            Questionnaire questionnaire = null;
            if(optional.isPresent()){
                questionnaire = optional.get();
            }else{
                response.error("问卷"+questionnaireId+"不存在");
                return response;
            }

//            GetQuestionnaireResponse getResponse = new GetQuestionnaireResponse(questionnaire);
//            getResponse.setQuestions(questionService.getQuestions(questionnaire));
//            response.setData(getResponse);
            questionnaire.setUser(null);
            questionnaire.setQuestions(questionService.getQuestions(questionnaire));
            questionnaire.setRelations(relationService.getRelations(questionnaire));
            response.setData(questionnaire);
        }catch (Exception e){
            e.printStackTrace();
            response.error(e.getMessage());
        }
        
        return response;
    }
    
    
    public void copy(Integer userId,Integer questionnaireId){
        User user = userDao.getById(userId);
        Questionnaire oldQuestionnaire = questionnaireDao.getById(questionnaireId);
        //拷贝基本信息
        Questionnaire questionnaire = new Questionnaire(oldQuestionnaire);
        //设置用户
        questionnaire.setUser(user);
        
        questionnaire = questionnaireDao.save(questionnaire);
        //题目拷贝
        questionService.copyQuestions(questionnaire,oldQuestionnaire);

    }

    //彻底删除问卷
    public CommonResponse deleteQuestion(Questionnaire questionnaire){
        CommonResponse cr = new CommonResponse();
        try{
            List<QuestionnaireRecord> questionnaireRecords = questionnaireRecordDao.findByQuestionnaire(questionnaire);
            for (QuestionnaireRecord questionnaireRecord : questionnaireRecords) {
                questionSequenceRecordDao.deleteByQuestionnaireRecord(questionnaireRecord);
            }
            questionnaireRecordDao.deleteByQuestionnaire(questionnaire);
            relationDao.deleteByQuestionnaire(questionnaire);

            List<SingleChoiceQuestion>  singleChoiceQuestion = singleChoiceQuestionDao.findByQuestionnaire(questionnaire);
            List<MultiChoiceQuestion> multiChoiceQuestion = multiChoiceQuestionDao.findByQuestionnaire(questionnaire);
            List<FillBlankQuestion> fillBlankQuestion = fillBlankQuestionDao.findByQuestionnaire(questionnaire);
            List<ScoreQuestion> scoreQuestion = scoreQuestionDao.findByQuestionnaire(questionnaire);
            for (SingleChoiceQuestion choiceQuestion : singleChoiceQuestion) {
                singleChoiceQuestionService.completeDelete(choiceQuestion);
            }
            for (MultiChoiceQuestion choiceQuestion : multiChoiceQuestion) {
                multiChoiceQuestionService.completeDelete(choiceQuestion);
            }
            for (FillBlankQuestion blankQuestion : fillBlankQuestion) {
                fillBlankQuestionService.completeDelete(blankQuestion);
            }
            for (ScoreQuestion question : scoreQuestion) {
                scoreQuestionService.completeDelete(question);
            }

            cr.setCode(0);
            cr.setMsg("成功删除");
        }catch (Exception e){
            cr.error(e.getMessage());
        }
        return cr;
    }

    //彻底删除答卷
    public CommonResponse deleteAnswer(Questionnaire questionnaire){
        CommonResponse cr = new CommonResponse();
        try{
            List<QuestionnaireRecord> questionnaireRecords = questionnaireRecordDao.findByQuestionnaire(questionnaire);
            for (QuestionnaireRecord questionnaireRecord : questionnaireRecords) {
                questionSequenceRecordDao.deleteByQuestionnaireRecord(questionnaireRecord);
            }
            questionnaireRecordDao.deleteByQuestionnaire(questionnaire);
            List<SingleChoiceQuestion>  singleChoiceQuestion = singleChoiceQuestionDao.findByQuestionnaire(questionnaire);
            List<MultiChoiceQuestion> multiChoiceQuestion = multiChoiceQuestionDao.findByQuestionnaire(questionnaire);
            List<FillBlankQuestion> fillBlankQuestion = fillBlankQuestionDao.findByQuestionnaire(questionnaire);
            List<ScoreQuestion> scoreQuestion = scoreQuestionDao.findByQuestionnaire(questionnaire);
            for (SingleChoiceQuestion choiceQuestion : singleChoiceQuestion) {
                singleChoiceQuestionService.deleteAnswer(choiceQuestion);
            }
            for (MultiChoiceQuestion choiceQuestion : multiChoiceQuestion) {
                multiChoiceQuestionService.deleteAnswer(choiceQuestion);
            }
            for (FillBlankQuestion blankQuestion : fillBlankQuestion) {
                fillBlankQuestionService.deleteAnswer(blankQuestion);
            }
            for (ScoreQuestion question : scoreQuestion) {
                scoreQuestionService.deleteAnswer(question);
            }
            cr.setCode(0);
            cr.setMsg("成功删除");
        }catch (Exception e){
            cr.error(e.getMessage());
        }

        return cr;
    }

    //根据添加类型预设默认值
    public CommonResponse addQuestionnaire(String type,Questionnaire questionnaire){
        CommonResponse cr = new CommonResponse();
        try{
            Map<String, Integer> map = new HashMap<>();
            map.put("id",questionnaire.getId());
            cr.setData(map);
            if(type==null || type.trim().equals("")){
                cr.setMsg("生成普通问卷成功");
            }
            else if(type.equals("vote")){
                singleChoiceQuestionService.addVoteQuestion(questionnaire);
            }
            else if(type.equals("sign")){
                fillBlankQuestionService.addNameQuestion(questionnaire,0);
                fillBlankQuestionService.addPhoneNumQuestion(questionnaire);
                singleChoiceQuestionService.addSignQuestion(questionnaire);
            }
            else if(type.equals("exam")){
                fillBlankQuestionService.addStudentIdQuestion(questionnaire);
                fillBlankQuestionService.addNameQuestion(questionnaire,1);

            }
            else if(type.equals("card")){
                fillBlankQuestionService.addStudentIdQuestion(questionnaire);
                fillBlankQuestionService.addNameQuestion(questionnaire,1);
                singleChoiceQuestionService.addTemperatureQuestion(questionnaire);
                singleChoiceQuestionService.addEnvironmentQuestion(questionnaire);
                singleChoiceQuestionService.addInfecttQuestion(questionnaire);
                fillBlankQuestionService.addLocationQuestion(questionnaire);
            }
            cr.setCode(0);
        } catch (Exception e){
            cr.error(e.getMessage());
        }
        return cr;
    }
    
}
